from django.db import models


class Grade(models.Model):
    """班级模型类"""
    # 班级名称（必填字段，最大长度 100 字符）
    name = models.CharField(
        max_length=100,
        verbose_name="班级名称",  # 后台管理界面显示的名称
        help_text="请输入班级名称（如：高一1班）"  # 输入提示
    )

    # 元选项：指定数据库表名、后台显示名称等
    class Meta:
        db_table = "grade"  # 强制数据库表名为 `grade`（关键配置！）
        verbose_name = "班级"  # 后台管理界面单数显示名称
        verbose_name_plural = "班级"  # 后台管理界面复数显示名称（避免自动加 s）

    # 字符串表示（后台管理界面显示班级名称）
    def __str__(self):
        return self.name


class Student(models.Model):
    """学生模型类"""
    # 性别选项（用于 choices 参数）
    GENDER_CHOICES = [
        ('male', '男'),
        ('female', '女'),
    ]

    # 姓名（必填，最大长度 50）
    name = models.CharField(
        max_length=50,
        verbose_name="姓名",
        help_text="请输入学生姓名"
    )

    # 性别（必填，使用预设选项）
    gender = models.CharField(
        max_length=10,
        choices=GENDER_CHOICES,  # 限制只能选预设值
        verbose_name="性别",
        help_text="请选择性别（男/女/其他）"
    )

    # 学号（唯一标识，必填，最大长度 20）
    student_id = models.CharField(
        max_length=20,
        unique=True,  # 学号全局唯一
        verbose_name="学号",
        help_text="请输入唯一学号（如：20240101）"
    )

    # 出生日期（可选，允许为空）
    birth_date = models.DateField(
        null=True,  # 数据库允许为空
        blank=True,  # 表单提交允许为空
        verbose_name="出生日期",
        help_text="格式：YYYY-MM-DD（可选）"
    )

    # 班级关联（外键指向已有的 Grade 模型）
    grade = models.ForeignKey(
        Grade,  # 关联的班级模型
        on_delete=models.CASCADE,  # 班级删除时，学生记录级联删除（可根据需求调整）
        related_name="students",  # 反向查询时使用（如 grade.students.all() 获取班级所有学生）
        verbose_name="所属班级",
        help_text="请选择学生所属班级"
    )

    # 元选项：指定数据库表名、后台显示名称等
    class Meta:
        db_table = "student"  # 强制数据库表名为 `student`（关键配置！）
        verbose_name = "学生"  # 后台管理界面单数显示名称
        verbose_name_plural = "学生"  # 后台管理界面复数显示名称（避免自动加 s）

    # 字符串表示（后台管理界面显示学生姓名）
    def __str__(self):
        return self.name


# ------------------------------ 资产模型类 ------------------------------
class Asset(models.Model):
    """学校资产模型类（管理班级共用资产，如橡皮、扫把等）"""
    # 资产名称（必填，如“橡皮”“扫把”）
    name = models.CharField(
        max_length=50,
        verbose_name="资产名称",
        help_text="请输入资产名称（如：橡皮、剪刀）"
    )

    # 资产类别（可选，按用途分类）
    CATEGORY_CHOICES = [
        ('stationery', '文具用品'),  # 如橡皮、铅笔、作业本
        ('cleaning', '清洁工具'),  # 如扫把、拖把、垃圾桶
        ('teaching', '教学工具'),  # 如粉笔、黑板擦、投影仪
        ('other', '其他资产'),  # 其他未分类资产
    ]
    category = models.CharField(
        max_length=20,
        choices=CATEGORY_CHOICES,
        verbose_name="资产类别",
        help_text="请选择资产类别（如文具用品、清洁工具）"
    )

    # 资产数量（必填，如“10个”“5把”）
    quantity = models.PositiveIntegerField(
        verbose_name="资产数量",
        help_text="请输入资产数量（如：10）"
    )

    # 单位（可选，如“个”“把”“盒”）
    unit = models.CharField(
        max_length=10,
        null=True, blank=True,
        verbose_name="计量单位",
        help_text="如：个、把、盒（可选）"
    )

    # 资产状态（必填，如“在用”“损坏”“待维修”）
    STATUS_CHOICES = [
        ('in_use', '在用'),  # 正常使用中
        ('damaged', '损坏'),  # 已损坏无法使用
        ('to_repair', '待维修'),  # 需要维修但未处理
        ('scrapped', '已报废'),  # 已确认报废
    ]
    status = models.CharField(
        max_length=20,
        choices=STATUS_CHOICES,
        default='in_use',
        verbose_name="资产状态",
        help_text="请选择资产当前状态（如在用、损坏）"
    )

    # 所属班级（必填，关联 Grade 模型）
    class_owner = models.ForeignKey(
        Grade,
        on_delete=models.CASCADE,  # 班级删除时，资产同步删除
        related_name="assets",  # 反向查询：grade.assets 获取班级所有资产
        verbose_name="所属班级",
        help_text="请选择资产所属班级"
    )

    # 存放位置（必填，如“教室第一排储物柜”“讲台旁”）
    location = models.CharField(
        max_length=100,
        verbose_name="存放位置",
        help_text="格式：教室具体位置（如：教室第一排储物柜）"
    )

    # 购买时间（可选，记录资产购置时间）
    purchase_date = models.DateField(
        null=True, blank=True,
        verbose_name="购买时间",
        help_text="格式：YYYY-MM-DD（可选）"
    )

    # 购买价格（可选，记录单价）
    price = models.DecimalField(
        max_digits=8, decimal_places=2,
        null=True, blank=True,
        verbose_name="购买价格（元）",
        help_text="请输入单价（如：5.5元）"
    )

    # 备注（可选，记录资产详情）
    remark = models.TextField(
        null=True, blank=True,
        verbose_name="备注",
        help_text="如：含10个小包装、红色款"
    )

    class Meta:
        db_table = "asset"  # 数据库表名强制为 asset
        verbose_name = "班级资产"
        verbose_name_plural = "班级资产"
        ordering = ['-purchase_date']  # 默认按购买时间倒序排列

    def __str__(self):
        # 后台显示：资产名称（数量+单位）- 类别 - 状态 - 所属班级
        unit_display = f"{self.quantity}{self.unit}" if self.unit else str(self.quantity)
        return f"{self.name}（{unit_display}）- {self.get_category_display()} - {self.get_status_display()} - {self.class_owner.name}"
